(function($){
	function createCombobox(jq,options){
		var self=jq;
		//var value=options.value;
		var data=options.data;
		//jq.attr('type','hidden');
		jq.hide();
		var div=$('<div class="dropdown combobox"/>');
		self.after(div);
		var txtInp=$('<input readonly class="form-control dropdown-toggle" data-toggle="dropdown" value="" />');
		txtInp.appendTo(div);
		var ul=$('<ul class="dropdown-menu" style="max-height: 250px;overflow: auto;"/>');
		ul.appendTo(div);
		for(var i=0;i<data.length;i++){
			var obj=data[i];
			var li=$('<li/>').val(obj.value).append($('<a/>').text(obj.text));
			if(obj.value==options.value){
				txtInp.val(obj.text);
				li.addClass('active');
			}
			ul.append(li);
		}
		ul.find('li').click(function(){
			var value=$(this).val();
			var text=$(this).find('a').text();
			var oldVal=null;
			var oldSelected=$(this).parent().find('li.active');
			if(oldSelected){
				oldVal=oldSelected.val();
			}
			if(value!=oldVal){
				options.value=value;
				self.val(value);
				txtInp.val(text);
				oldSelected.removeClass('active');
				$(this).addClass('active');
				var method=options.onchange;
				method(value,oldVal);
			}
			
		})
	}
	
	$.extend($.fn,{
		'combobox':function(options,param){
			if(typeof options =='string'){
				var method=$.fn.combobox.methods[options];
				return method(this,param);
			}
			options=options||{};
			return this.each(function(){
				var self=$(this);
				var value=self.val();
				var options2=self.data('combobox');
				if(options2){
					options=$.extend({},options2,options);
					$.fn.combobox.methods.destroy(self);
				}
				var data_options_str='{'+this.dataset['options']+'}';
				var data_options=eval('('+data_options_str+')');
				options=$.extend({},data_options,options);
				var opts=$.extend({},$.fn.combobox.defaults,options);
				var data=opts.data;
				if(!data||data.length==0){
					data=[];
					var url=opts.url;
					var valueField=opts.valueField;
					var textField=opts.textField;
					var resultText=$.ajax({
						url:url,
						async:false
					}).responseText;
					var result=eval('('+resultText+')');
					for(var i=0;i<result.length;i++){
						var obj1=result[i];
						var obj2={};
						obj2.value=obj1[valueField];
						obj2.text=obj1[textField];
						data.push(obj2);
					}
				}
				opts.data=data;
				opts.value=value;
				self.data('combobox',opts);
				createCombobox(self,opts);
			})
			
		}
	});
	
	$.fn.combobox.methods={
		'options':function(jq){
			return jq.data('combobox');
		},
		'getValue':function(jq){
			var opts=jq.data('combobox');
			return opts.value;
		},
		'setValue':function(jq,newVal){
			
		},
		'destroy':function(jq){
			jq.show();
			jq.next('div.dropdown').remove();
		}
	};
	$.fn.combobox.defaults={
		valueField:'value',
		textField:'text',
		url:'',
		data:null,
		onchange:function(newVal,oldVal){
			
		}
	}
	
	$.fn.parser={
		'plugins':['combobox'],
		'parse':function(context){
			for(var i=0;i<$.fn.parser.plugins.length;i++){
				var name=$.fn.parser.plugins[i];
				var r=$('.'+name,context);
				if(r[name]){
					r[name]();
				}
			}
		}
	}
	
	$(function(){
		$.fn.parser.parse();
	});
	
})($);